package com.fr.plugin.filter;

import com.fr.decision.authority.data.User;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.decision.webservice.service.user.UserMiddleRoleService;
import com.fr.decision.webservice.v10.user.UserService;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.transform.FunctionRecorder;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 这个就是一个过滤器接口的具体实现类,理论上应该是实现GlobalRequestFilterProvider 接口的，但是帆软这边
 * 接口都会有一个抽象类， 都会是去继承抽象类实现，一般都是“Abstract接口名"就是对应的抽象类
 * 所以这个接口类继承的就是AbstractGlobalRequestFilterProvider
 * @author ezreal
 * @version 10.0
 * @date 2022/1/22
 */
@FunctionRecorder
public class XinYinRequestFilterProvider extends AbstractGlobalRequestFilterProvider {
    private FRLoginService frLoginService = new FRLoginService();

    private String redirectUrl="/webroot/decision";
    /**
     * 过滤器名字唯一的，
     * 这个名字会影响过滤器的是 当有多个过滤器实现的时候 ， 过滤器执行的先后顺序
     * @return
     */
    @Override
    public String filterName() {
        return "xinyin";
    }

    /**
     * 过滤器拦截的路径，这个demo就是拦截了帆软的主页路径
     * @return
     */
    @Override
    public String[] urlPatterns() {
        return new String[]{
              "/decision/html/idx",
              "/decision/vcs/auth/*"
        };
    }


    /**
     * 过滤器的拦截逻辑 就是对应的
     * @param req
     * @param res
     * @param filterChain
     */
    @Override
    public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) {
        String reqUrl = req.getPathInfo();
        FineLoggerFactory.getLogger().info("权限管理进入拦截器:{}",reqUrl);
        try {
            boolean ok = frLoginService.isLoginedFR(req);
            if(!ok){
                res.sendRedirect(redirectUrl);
                return;
            }
            //判断是否为超级管理员
            String userName = frLoginService.getFRCurrentName(req);
            FineLoggerFactory.getLogger().info("权限拦截，当前登陆的用户名为:{}",userName);
            User user = UserService.getInstance().getUserByUserName(userName);
            //校验是否为超级管理员
            boolean isAdmin = UserMiddleRoleService.getInstance().isAdmin(user.getId());
            if(!isAdmin){
                res.sendRedirect(redirectUrl);
                return;
            }
            filterChain.doFilter(req, res);
        } catch (Exception e) {
            FineLoggerFactory.getLogger().error("权限拦截异常",e);
            try {
                //兜底处理
                res.sendRedirect(redirectUrl);
            } catch (IOException ioException) {
                FineLoggerFactory.getLogger().error("权限拦截异常",e);
            }
        }
    }
}
